package br.com.admGearman.cadastro.negocio;

import java.util.HashMap;
import java.util.Map;

import org.hibernate.Criteria;
import org.hibernate.Session;
import org.hibernate.criterion.Order;

import br.com.admGearman.cadastro.vo.EstEmpresaVo;
import br.com.r2.exception.R2Exception;
import br.com.r2.util.hibernate.business.R2HbNgc;
import br.com.r2.util.hibernate.business.RestritorHb;

public class EstEmpresaNgc extends R2HbNgc<EstEmpresaVo>
{

   private Map filtroPropriedade = new HashMap();
   private Map restritores = new HashMap();
   
   private static EstEmpresaNgc instancia = null;
   
   public static final int JOIN_USUARIOS = 1;
   
   private EstEmpresaNgc()
   {
      init(restritores, filtroPropriedade, EstEmpresaVo.class);
      addFiltro("listaUsuarios.codigo", RestritorHb.RESTRITOR_EQ, "filtroVo.codigoUsuario");
      addFiltro("descricao", RestritorHb.RESTRITOR_LIKE, "descricao");
      addFiltro("descricaoReduzida", RestritorHb.RESTRITOR_LIKE, "descricaoReduzida");
   }
   
   public static EstEmpresaNgc getInstancia()
   {
       if (instancia == null)
       {
           instancia = new EstEmpresaNgc();
       }
       return instancia;
   }

   @Override
   protected Map filtroPropriedade()
   {
       return filtroPropriedade;
   }

   @Override
   protected Criteria montaCriteria(Session sessao, int join)
   {
       Criteria criteria = sessao.createCriteria(EstEmpresaVo.class);
       if ((join & JOIN_USUARIOS) != 0)
       {
          criteria.createCriteria("listaUsuarios", "listaUsuarios", Criteria.INNER_JOIN);
       }
       return criteria;
   }
   
   @Override
   protected void setarOrdenacao(Criteria criteria, EstEmpresaVo filter,
         int join)
   {
      criteria.addOrder(Order.asc("descricaoReduzida"));
   }

   @Override
   protected Map restritores()
   {
       return restritores;
   }
   
   @Override
   protected void validarInserir(Session sessao, EstEmpresaVo vo) throws R2Exception
   {
      validar(sessao, vo);
   }
   
   @Override
   protected void validarAlterar(Session sessao, EstEmpresaVo vo) throws R2Exception
   {
      validar(sessao, vo);
      
      if (vo.getCodigo() == null || !vo.getCodigo().isPreenchido())
      {
         throw new R2Exception("campo.obrigatorio", new String[] { "lbl_codigo" });
      }
   }

   public void validar(Session sessao, EstEmpresaVo vo) throws R2Exception
   {
      if (vo == null)
      {
         throw new R2Exception("campo.obrigatorio", new String[] { "lbl_empresa" });
      }
      if (vo.getDescricao() == null || vo.getDescricao().getValor() == null || vo.getDescricao().getValor().trim().equals(""))
      {
         throw new R2Exception("campo.obrigatorio", new String[] { "lbl_nome" });
      }
      if (vo.getDescricaoReduzida() == null || vo.getDescricaoReduzida().getValor() == null || vo.getDescricaoReduzida().getValor().trim().equals(""))
      {
         throw new R2Exception("campo.obrigatorio", new String[] { "lbl_nome_reduzido" });
      }
      if (vo.getCnpj() == null || !vo.getCnpj().isPreenchido())
      {
         throw new R2Exception("campo.obrigatorio", new String[] { "lbl_cnpj" });
      }
      if (vo.getFlagIntegracao() == null || !vo.getFlagIntegracao().isPreenchido())
      {
         throw new R2Exception("campo.obrigatorio", new String[] { "lbl_flag_integracao" });
      }
   }
}

